// let message: string = "Hello World";
// console.log(message)
//
// const hello : string = "hello"
// console.log(hello)
//
// // typescript面向对象
// class Site {
//     name():void {
//         console.log("noob")
//     }
// }
//
// let obj = new Site();
// obj.name()

/*
Webstorm 编写运行 typescript 的方式：
npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist
npm -g install typescript

tsc -v

npm install -g ts-node

node.js+npm+tsc+webstorm+webstorm插件+ts_node

// 执行以下命令将 TypeScript 转换为 JavaScript 代码：tsc app.ts
// 使用 node 命令来执行 app.js 文件：node app.js
// 以同时编译多个 ts 文件：tsc file1.ts file2.ts file3.ts
* */

// const hello: string = "hello";
// console.log(hello);
//
// class Site {
//     name():void {
//         console.log("Runoob");
//     }
// }
// let obj1 = new Site();
// obj1.name();

// let globalNum = 12;
// class Numbers {
//     numVal = 13;
//     static sval = 10;
//
//     storeNum(): void {
//         let localNum = 14;
//     }
// }
// console.log(globalNum);
// console.log(Numbers.sval);
// let obj = new Numbers();
// // 局部变量怎么获取？？
// console.log(obj.numVal);


// function addNumbers(...nums: number[]) {
//     let i;
//     let sum: number = 0;
//     for (i=0; i<nums.length; i++) {
//         sum = sum + nums[i];
//     }
//     console.log(sum);
// }
// addNumbers(1,2,3)
//
//
// let arr:number[] = [12,13]
// let[x,y] = arr // 将数组的两个元素赋值给变量 x 和 y
// console.log(x)
// console.log(y)


// function disp(name:string|string[]) {
//     if(typeof name == "string") {
//         console.log(name)
//     } else {
//         var i;
//         for(i = 0;i<name.length;i++) {
//             console.log(name[i])
//         }
//     }
// }
// disp("Runoob")
// // 中文输出乱码
// console.log("输出数组....")
// disp(["Runoob","Google","Taobao","Facebook"])


// const readline = require('readline');
//
// const rl = readline.createInterface({
//     input: process.stdin,
//     output: process.stdout
// });
//
// rl.on('line', function (line) {
//     var base = 64;
//     var sum = 0;
//     for (let i = 2;i < line.length;i++) {
//         if (line[i] > '9') {
//             sum = sum + (line[i].charCodeAt() - base + 9) * Math.pow(16, line.length - 1 - i);
//         } else {
//             sum = sum + parseInt(line[i], 10) * Math.pow(16, line.length - 1 - i);
//         }
//     }
//     console.log(sum)
// });

// 0xA
// 0xAA

// // TypeScript
// import readline = require('readline');
//
// const rl = readline.createInterface({
//     input: process.stdin,
//     output: process.stdout
// });
// rl.on('line', function (line) {
//     const tokens = line.split(' ');
//     const output = count(parseInt(tokens[0]));
//     console.log(output);
// });
//
// function count(input: number): number {
//     if (input > 0 && input <= 500000) {
//         let count = 0;
//         for (let j = 2; j < input; j++) {
//             let total = 1;
//             for (let i = 2; i < j; i++) {
//                 if (j % i === 0) {
//                     total+=i;
//                 }
//             }
//             if (total === j) {
//                 count++;
//             }
//         }
//         return count;
//     }
// }



// class RandomizedSet {
//     private readonly array: number[]
//     private indexMap: Map<number, number>
//
//     constructor() {
//         this.array = []
//         this.indexMap = new Map()
//     }
//
//     insert(val: number): boolean {
//         if(this.indexMap.get(val) !== undefined){
//             return false
//         }
//         this.array.push(val)
//         this.indexMap.set(val, this.array.length - 1)
//         return true
//     }
//
//     remove(val: number): boolean {
//         const deleteIndex = this.indexMap.get(val)
//         if(deleteIndex === undefined){
//             return false
//         }
//         const lastElement = this.array[this.array.length - 1]
//         // 把要删除的元素和最后一个元素进行交换
//         this.array[deleteIndex] = lastElement
//         // 删除元素
//         this.array.pop()
//         // 更新元素下标
//         this.indexMap.set(lastElement, deleteIndex)
//         // 删除删掉元素的下标
//         this.indexMap.delete(val)
//         return true
//     }
//
//     getRandom(): number {
//         // key is the value, value is the index // @ts-ignore // 加这个报错检查消除，但是数组里数字输出是undefined???
//         // @ts-ignore
//         return [...this.indexMap.keys()][Math.floor(Math.random() * this.indexMap.size)]
//     }
//
// }
//
// /**
//  * Your RandomizedSet object will be instantiated and called as such:
//  * var obj = new RandomizedSet()
//  * var param_1 = obj.insert(val)
//  * var param_2 = obj.remove(val)
//  * var param_3 = obj.getRandom()
//  */


class RandomizedSet {
    // 加readonly消除了下划线提醒
    private readonly list: number[]
    constructor() {
        this.list = [];
    }

    insert(val: number): boolean {
        if (this.list.includes(val)) {
            return false
        }
        this.list.push(val)
        return true
    }

    remove(val: number): boolean {
        if (!this.list.includes(val)) {
            return false
        }
        const index = this.list.indexOf(val)
        this.list.splice(index, 1);
        return true
    }

    getRandom(): number {
        const m = Math.floor(Math.random() * this.list.length)
        return this.list[m]
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * var obj = new RandomizedSet()
 * var param_1 = obj.insert(val)
 * var param_2 = obj.remove(val)
 * var param_3 = obj.getRandom()
 */
// https://leetcode-cn.com/problems/insert-delete-getrandom-o1/solution/zhi-jie-xie-by-star-120-li30/



let readLine = require("readline");
const rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout
});

let rows = []
let lineNum = 2

rl.on("line", function (line) {
    rows.push(line);
    if (rows.length === lineNum) {
        // console.log("rows: ", rows);

        let result = []
        let obj = new RandomizedSet();
        result.push(null);

        let commands = JSON.parse(rows[0]);
        let nums = JSON.parse(rows[1]);

        for (let i=0; i<commands.length; i++) {
            let c = commands[i];
            if (c === "insert") {
                result.push(obj.insert(nums[i][0]));
            } else if (c === "remove") {
                result.push(obj.remove(nums[i][0]));
            } else if (c === "getRandom") {
                result.push(obj.getRandom());
            }
        }

        console.log(result);

        // 重置
        rows.length = 0;
    }

})

/*
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
* */


